const jwt = require('jsonwebtoken');
const { error } = require('../utils/common');
const User = require('../models/User');

/**
 * JWT认证中间件
 */
const authenticateToken = async (req, res, next) => {
  try {
    // 从请求头获取token
    const authHeader = req.headers.authorization;
    const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN

    if (!token) {
      return res.status(401).json(error('未提供认证token', 401));
    }

    // 验证token
    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'wanyue-education-jwt-secret-key-2024');
    
    // 查找用户
    const user = await User.findByPk(decoded.id);
    if (!user) {
      return res.status(401).json(error('用户不存在', 401));
    }

    // 检查用户状态
    if (user.status !== 'active') {
      return res.status(401).json(error('账户已被禁用', 401));
    }

    // 将用户信息添加到请求对象
    req.user = user;
    next();
  } catch (err) {
    if (err.name === 'TokenExpiredError') {
      return res.status(401).json(error('token已过期', 401));
    } else if (err.name === 'JsonWebTokenError') {
      return res.status(401).json(error('token无效', 401));
    } else {
      console.error('Token验证错误:', err);
      return res.status(500).json(error('服务器内部错误', 500));
    }
  }
};

/**
 * 角色权限中间件
 */
const requireRole = (roles) => {
  return (req, res, next) => {
    if (!req.user) {
      return res.status(401).json(error('未认证', 401));
    }

    // 检查用户角色
    if (!roles.includes(req.user.role)) {
      return res.status(403).json(error('权限不足', 403));
    }

    next();
  };
};

/**
 * 教师权限中间件
 */
const requireTeacher = requireRole(['teacher', 'admin', 'super_admin']);

/**
 * 管理员权限中间件
 */
const requireAdmin = requireRole(['admin', 'super_admin']);

/**
 * 超级管理员权限中间件
 */
const requireSuperAdmin = requireRole(['super_admin']);

/**
 * 可选认证中间件（不强制要求登录）
 */
const optionalAuth = async (req, res, next) => {
  try {
    const authHeader = req.headers.authorization;
    const token = authHeader && authHeader.split(' ')[1];

    if (token) {
      const decoded = jwt.verify(token, process.env.JWT_SECRET || 'wanyue-education-jwt-secret-key-2024');
      const user = await User.findByPk(decoded.id);
      
      if (user && user.status === 'active') {
        req.user = user;
      }
    }
    
    next();
  } catch (err) {
    // 可选认证失败不影响请求继续
    next();
  }
};

module.exports = {
  authenticateToken,
  requireRole,
  requireTeacher,
  requireAdmin,
  requireSuperAdmin,
  optionalAuth
}; 